#include <pthread.h>
#include <sys/syscall.h>

#define MGC_DEFAULT_TIME 3            /*默认时间5s*/
#define MGC_MIN_WAIT_TASK_NUM 1000       /*当任务数超过了它，就该添加新线程了*/
#define MGC_DEFAULT_THREAD_NUM 1      /*每次创建或销毁的线程个数*/


/*任务*/
typedef struct {
   void *(*function)(void *);
   void *arg;
} mgc_threadpool_task_t;

/*线程池管理*/
typedef struct {
   pthread_mutex_t lock;                 /* 锁住整个结构体 */
   pthread_mutex_t thread_counter;       /* 用于使用忙线程数时的锁 */
   pthread_cond_t  queue_not_full;       /* 条件变量，任务队列不为满 */
   pthread_cond_t  queue_not_empty;      /* 任务队列不为空 */

   char            *thread_name;
   pid_t           thread_id;

   pthread_t *threads;                   /* 存放线程的tid,实际上就是管理了线 数组 */
   pthread_t admin_tid;                  /* 管理者线程tid */
   mgc_threadpool_task_t *task_queue;        /* 任务队列 */

   /*线程池信息*/
   int min_thr_num;                      /* 线程池中最小线程数 */
   int max_thr_num;                      /* 线程池中最大线程数 */
   int live_thr_num;                     /* 线程池中存活的线程数 */
   int busy_thr_num;                     /* 忙线程，正在工作的线程 */
   int wait_exit_thr_num;                /* 需要销毁的线程数 */

   /*任务队列信息*/
   int queue_front;                      /* 队头 */
   int queue_rear;                       /* 队尾 */
   int queue_size; 

   /* 存在的任务数 */
   int queue_max_size;                   /* 队列能容纳的最大任务数 */
   /*线程池状态*/
   int shutdown;                         /* true为关闭 */
}mgc_threadpool_t;
pid_t gettid();
mgc_threadpool_t *mgc_threadpool_create(const char * thread_name, int min_thr_num, int max_thr_num, int queue_max_size);
void *mgc_threadpool_thread(void *threadpool);
int mgc_threadpool_add_task(mgc_threadpool_t *pool, void *(*function)(void *arg), void *arg);
void *mgc_admin_thread(void *threadpool);
int mgc_is_thread_alive(pthread_t tid);
int mgc_threadpool_free(mgc_threadpool_t *pool);
int mgc_threadpool_destroy(mgc_threadpool_t *pool);